﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Dominio;
using LogicaNegocios.Manager;
using System.IO;
using LogicaNegocios.Exceptions;

namespace UIWeb
{
    public partial class MantenimientoEvento : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            UsuarioManager um = UsuarioManager.GetManager();
            if (Session["userLogin"] == null)
            {
                Response.Redirect("~/UserLogin.aspx");
            }
            else
            {
                if (um.esSeguidor((Usuario)Session["userLogin"]) || um.noTieneRol((Usuario)Session["userLogin"]))
                    if (um.esAdmin((Usuario)Session["userLogin"]))
                    {
                        Response.Redirect("~/Default.aspx");
                    }
                    else
                        Response.Redirect("~/Default_seguidores.aspx");
                else
                {



                    if (!IsPostBack)
                    {
                        CargarDeportes();
                        if (DropDownListDeportes.Items.Count > 0)
                        {
                            DropDownListDeportes.SelectedIndex = 0;
                            CargarParticipantes(int.Parse(DropDownListDeportes.Items[0].Value));
                        }
                    }
                    CargarPlanillaEventos();
                }
            }
        }

        public void BorrarCampos()
        {
            txtFecha.Text = "";
            txtStartTime.Text = "";

            if (DropDownListDeportes.Items.Count > 0)
            {
                DropDownListDeportes.SelectedIndex = 0;
                CargarParticipantes(int.Parse(DropDownListDeportes.Items[0].Value));
            }
        }

        protected void GridViewEventos_SelectedIndexChanged(object sender, EventArgs e)
        {
            int indice = GridViewEventos.SelectedIndex;
            int id = int.Parse(GridViewEventos.DataKeys[indice].Value.ToString());
            EventoManager eventoMgr = EventoManager.GetManager();
            Evento evento = eventoMgr.GetEvento(id);
            DropDownListDeportes.SelectedIndex = 0;
            DropDownListDeportes.SelectedValue = evento.Deporte.Id + "";
            CargarParticipantes(evento.Deporte.Id, evento);
            txtFecha.Text = evento.FechaHora.ToShortDateString();
            txtStartTime.Text = evento.FechaHora.ToShortTimeString();

            //DropDownListDeportes.SelectedIndex = 0;
            //CargarParticipantes(int.Parse(DropDownListDeportes.SelectedValue));
            //              Evento evento = EventoManager.GetManager().GetEvento(eventoId);
            //DropDownListDeportes.SelectedValue = evento.Deporte.Id + "";
            //CargarParticipantes(evento.Deporte.Id, evento);
            //txtFecha.Text = evento.FechaHora.ToShortDateString();
            //txtStartTime.Text = evento.FechaHora.ToShortTimeString();
            //CargarPlanillaEventos();

        }

        private void CargarDeportes()
        {
            List<Deporte> deportes = DeporteManager.GetManager().GetDeportes();
            DropDownListDeportes.DataTextField = "Nombre";
            DropDownListDeportes.DataValueField = "Id";
            DropDownListDeportes.DataSource = deportes;
            DropDownListDeportes.DataBind();
        }

        private void CargarParticipantes(int deporteId)
        {
            List<Participante> participantes = ParticipanteManager.GetManager().GetAtletasEquiposByDeporte(deporteId);
            lstParticipantesNoSeleccionados.DataTextField = "Nombre";
            lstParticipantesNoSeleccionados.DataValueField = "Id";
            lstParticipantesNoSeleccionados.DataSource = participantes;
            lstParticipantesNoSeleccionados.DataBind();

            lstParticipantesSeleccionados.DataSource = new List<Participante>();
            lstParticipantesSeleccionados.DataBind();

        }

        private void CargarParticipantes(int deporteId, Evento evento)
        {
            List<Participante> participantesPorDeporte = ParticipanteManager.GetManager().GetAtletasEquiposByDeporte(deporteId);
            List<Participante> participantesNoSeleccionados = new List<Participante>();

            foreach (Participante participante in participantesPorDeporte)
            {
                if (!evento.Participantes.Contains(participante, new ParticipanteComparer()))
                {
                    participantesNoSeleccionados.Add(participante);
                }
            }

            lstParticipantesNoSeleccionados.DataTextField = "Nombre";
            lstParticipantesNoSeleccionados.DataValueField = "Id";
            lstParticipantesNoSeleccionados.DataSource = participantesNoSeleccionados;
            lstParticipantesNoSeleccionados.DataBind();

            lstParticipantesSeleccionados.DataTextField = "Nombre";
            lstParticipantesSeleccionados.DataValueField = "Id";
            lstParticipantesSeleccionados.DataSource = evento.Participantes;
            lstParticipantesSeleccionados.DataBind();
        }

        protected void lnkAlta_Click(object sender, EventArgs e)
        {
            try
            {
                if (lstParticipantesSeleccionados.Items.Count >= 2)
                {
                    Evento evento = new Evento();

                    string fecha = txtFecha.Text;
                    string hora = txtStartTime.Text;
                    DateTime fechaHora = DateTime.Parse(fecha + " " + hora);
                    evento.FechaHora = fechaHora;

                    Deporte deporte = new Deporte();
                    deporte.Id = int.Parse(DropDownListDeportes.SelectedValue);
                    evento.Deporte = deporte;

                    //int[] idsParticipantesSeleccionados = lstParticipantesSeleccionados.GetSelectedIndices();

                    foreach (ListItem selectedItem in lstParticipantesSeleccionados.Items)
                    {
                        //ListItem selectedItem = lstParticipantesSeleccionados.Items[idsParticipantesSeleccionados[i]];
                        Participante participante = ParticipanteManager.GetManager().GetAtletaEquipo(int.Parse(selectedItem.Value));
                        evento.Participantes.Add(participante);
                    }

                    EventoManager.GetManager().CrearEvento(evento);

                    BorrarCampos();
                    CargarPlanillaEventos();
                    UpdatePanel1.Update();
                }
                else
                {
                    lblError.Text = "Se deben seleccionar al menos 2 participantes";
                }
            }
            catch (EventoException ex)
            {
                lblError.Text = ex.Message;
            }
        }

        protected void lnkModificar_Click(object sender, EventArgs e)
        {
            try
            {
                if (lstParticipantesSeleccionados.Items.Count >= 2)
                {
                    Evento evento = new Evento();
                    int indice = GridViewEventos.SelectedIndex;
                    int id = int.Parse(GridViewEventos.DataKeys[indice].Value.ToString());
                    //evento.Id = (int)Session["eventoId"];
                    evento.Id = id;

                    string fecha = txtFecha.Text;
                    string hora = txtStartTime.Text;
                    DateTime fechaHora = DateTime.Parse(fecha + " " + hora);
                    evento.FechaHora = fechaHora;

                    Deporte deporte = new Deporte();
                    deporte.Id = int.Parse(DropDownListDeportes.SelectedValue);
                    evento.Deporte = deporte;

                    //int[] idsParticipantesSeleccionados = lstParticipantesSeleccionados.GetSelectedIndices();

                    foreach (ListItem selectedItem in lstParticipantesSeleccionados.Items)
                    {
                        //ListItem selectedItem = lstParticipantesSeleccionados.Items[idsParticipantesSeleccionados[i]];
                        Participante participante = ParticipanteManager.GetManager().GetAtletaEquipo(int.Parse(selectedItem.Value));
                        evento.Participantes.Add(participante);
                    }

                    EventoManager.GetManager().ModificarEventoDatosPrincipales(evento);
                    EventoManager.GetManager().ModificarEventoParticipantes(evento);

                    BorrarCampos();
                    CargarPlanillaEventos();
                    UpdatePanel1.Update();
                }
                else
                {
                    lblError.Text = "Se deben seleccionar al menos 2 participantes";
                }
            }
            catch (EventoException ex)
            {
                lblError.Text = ex.Message;
            }
        }

        protected void lnkEliminar_Click(object sender, EventArgs e)
        {
            try
            {
                //Evento evento = EventoManager.GetManager().GetEvento((int)Session["eventoId"]);
                int indice = GridViewEventos.SelectedIndex;
                int id = int.Parse(GridViewEventos.DataKeys[indice].Value.ToString());
                Evento evento = EventoManager.GetManager().GetEvento(id);

                EventoManager.GetManager().EliminarEvento(evento);

                BorrarCampos();
                CargarPlanillaEventos();
                UpdatePanel1.Update();
            }
            catch (EventoException ex)
            {
                lblError.Text = ex.Message;
            }
        }

        protected void btnSeleccionarParticipantes_Click(object sender, EventArgs e)
        {
            int[] idsParticipantesSeleccionados = lstParticipantesNoSeleccionados.GetSelectedIndices();

            for (int i = 0; i < idsParticipantesSeleccionados.Length; i++)
            {
                ListItem selectedItem = lstParticipantesNoSeleccionados.Items[idsParticipantesSeleccionados[i] - i];
                lstParticipantesSeleccionados.Items.Add(selectedItem);
                lstParticipantesNoSeleccionados.Items.RemoveAt(idsParticipantesSeleccionados[i] - i);
            }

            UpdatePanel1.Update();
        }

        protected void btnDeSeleccionarParticipantes_Click(object sender, EventArgs e)
        {
            int[] idsParticipantesNoSeleccionados = lstParticipantesSeleccionados.GetSelectedIndices();

            for (int i = 0; i < idsParticipantesNoSeleccionados.Length; i++)
            {
                ListItem selectedItem = lstParticipantesSeleccionados.Items[idsParticipantesNoSeleccionados[i] - i];
                lstParticipantesNoSeleccionados.Items.Add(selectedItem);
                lstParticipantesSeleccionados.Items.RemoveAt(idsParticipantesNoSeleccionados[i] - i);
            }

            UpdatePanel1.Update();
        }
        protected void DropDownListDeportes_SelectedIndexChanged(object sender, EventArgs e)
        {
            CargarParticipantes(int.Parse(DropDownListDeportes.SelectedValue));
            UpdatePanel1.Update();
        }

        private void CargarPlanillaEventos()
        {
            List<Evento> eventos = EventoManager.GetManager().GetEventos();
            GridViewEventos.DataSource = eventos;
            GridViewEventos.DataBind();
        }

        protected void GridViewEventos_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            GridViewEventos.PageIndex = e.NewPageIndex;
            GridViewEventos.DataBind();
        }

        protected void GridViewEventos_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "Edit")
            {
                Session["eventoSeleccionado"] = EventoManager.GetManager().GetEvento(int.Parse(e.CommandArgument.ToString()));
                Response.Redirect("MantenimientoResultadosEvento.aspx");
            }            
        }
    }
}